package cn.spdb.harrier.rpc.compress;

/**
 * 压缩算法枚举类，定义支持的压缩类型及对应的实现
 */
public enum CompressEnum {
    /**
     * 不压缩
     */
    NO(0, null),

    /**
     * Snappy 压缩算法
     */
    SNAPPY(1, new SnappyCompress()),

    /**
     * GZIP 压缩算法
     */
    GIZP(2, new GZipCompress());

    // 当前枚举关联的压缩实现对象
    private Compress compress;

    // 压缩类型的字节标识
    private byte type;

    /**
     * 构造方法
     *
     * @param type     压缩类型标识
     * @param compress 对应的压缩实现
     */
    private CompressEnum(int type, Compress compress) {
        this.compress = compress;
        this.type = (byte) type;
    }

    /**
     * 获取该枚举项对应的压缩实现
     *
     * @return 返回压缩接口实现对象
     */
    public Compress getCompress() {
        return compress;
    }

    public void setCompress(Compress compress) {
        this.compress = compress;
    }

    /**
     * 获取压缩类型的字节值
     *
     * @return 字节标识
     */
    public byte getType() {
        return type;
    }

    public void setType(byte type) {
        this.type = type;
    }

    /**
     * 根据字节类型获取对应的压缩实现
     *
     * @param type 压缩类型字节值
     * @return 返回匹配的压缩实现，未找到则返回 null
     */
    public static Compress getCompressByType(byte type) {
        for (CompressEnum compressEnum : CompressEnum.values()) {
            if (compressEnum.getType() == type) {
                return compressEnum.getCompress();
            }
        }
        return null;
    }
}

